//package com.xlh.wjdcserver.aspect;
//
//import com.common.context.BaseContext;
//import com.common.enumeration.OperationType;
//import com.xlh.wjdcserver.annotation.AutoFill;
//import lombok.extern.slf4j.Slf4j;
//import org.aspectj.lang.JoinPoint;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Before;
//import org.aspectj.lang.annotation.Pointcut;
//import org.aspectj.lang.reflect.MethodSignature;
//import org.springframework.stereotype.Component;
//
//import java.lang.reflect.Method;
//import java.time.LocalDateTime;
//
//@Slf4j
//@Component
//@Aspect
//public class AutoFillAspect {
//
//    // 切点表达式，拦截所有mapper包下的所有方法并且要带有AutoFill注解
//    @Pointcut("execution(* com.xlh.wjdcserver.mapper.*.*(..)) && @annotation(com.xlh.wjdcserver.annotation.AutoFill)")
//    public void autoPointCut(){
//
//    }
//
//    @Before("autoPointCut()")
//    public void autoFill(JoinPoint joinPoint)
//    {
//        log.info("开始进行数据填充");
//        // 获取方法签名
//        MethodSignature signature = (MethodSignature)joinPoint.getSignature();
//
//        // 获取方法上的注解
//        AutoFill annotation = signature.getMethod().getAnnotation(AutoFill.class);
//
//        // 获取注解中的操作类型
//        OperationType type = annotation.type();
//
//        // 获取方法参数，也就是实体对象
//        Object[] args = joinPoint.getArgs();
//        if (args == null || args.length == 0)
//        {
//            return;
//        }
//
//        // 获取实体对象
//        Object entity = args[0];
//
//        // 准备填充数据
//        LocalDateTime now = LocalDateTime.now();
//        String currentId = BaseContext.getCurrentId();
//        if (type == OperationType.INSERT)
//        {
//            try
//            {
//                // 获取填充数据的方法
//                Method setCreateUser = entity.getClass().getDeclaredMethod("setCreateUser", String.class);
//                Method setCreateTime = entity.getClass().getDeclaredMethod("setCreateTime", LocalDateTime.class);
//                Method setUpdateTime = entity.getClass().getDeclaredMethod("setUpdateTime", LocalDateTime.class);
//
//                // 调用方法填充数据
//                setCreateUser.invoke(entity, currentId);
//                setCreateTime.invoke(entity, now);
//                setUpdateTime.invoke(entity, now);
//            }
//            catch (Exception e)
//            {
//                throw new RuntimeException(e);
//            }
//        } else if (type == OperationType.UPDATE)
//        {
//            try
//            {
//                // 获取填充数据方法
//                Method setUpdateUser = entity.getClass().getDeclaredMethod("setUpdateUser", String.class);
//                Method setUpdateTime = entity.getClass().getDeclaredMethod("setUpdateTime", LocalDateTime.class);
//
//                // 调用方法填充数据
//                setUpdateUser.invoke(entity, currentId);
//                setUpdateTime.invoke(entity, now);
//            }
//            catch (Exception e)
//            {
//                throw new RuntimeException(e);
//            }
//        }
//    }
//}
